package com.wanyu.video.netty.chat;

import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.group.ChannelGroup;
import io.netty.channel.group.DefaultChannelGroup;
import io.netty.util.concurrent.GlobalEventExecutor;


public class NettyServerHandler extends SimpleChannelInboundHandler<String> {


    // 定义一个channel组，管理所有channel, 使用全局事件执行器
    private static ChannelGroup channels = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);


    @Override
    public void channelRegistered(ChannelHandlerContext ctx) throws Exception {

        Channel channel = ctx.channel();
        // 将该客户加入聊天的信息推送给其他在在线的客户端
        channels.writeAndFlush("【客户端】" + channel.remoteAddress().toString().replace("/", "")  + "加入聊天\n");
        channels.add(channel);
        System.out.println( ctx.channel().remoteAddress().toString().replace("/", "") + "上线了");
    }

    @Override
    public void channelUnregistered(ChannelHandlerContext ctx) throws Exception {
        System.out.println(ctx.channel().remoteAddress() + "下线了");
        channels.writeAndFlush("【客户端】 " + ctx.channel().remoteAddress().toString().replace("/", "")  + "离开了\n");
    }

    // 表示连接建立，一旦连接，第一个被执行
    @Override
    public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
//        Channel channel = ctx.channel();
//        // 将该客户加入聊天的信息推送给其他在在线的客户端
//        channels.writeAndFlush("【客户端】" + channel.remoteAddress() + "加入聊天\n");
//        channels.add(channel);
    }

    @Override
    public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
        //channels.writeAndFlush("【客户端】 " + ctx.channel().remoteAddress() + "离开了\n");
    }

    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        // System.out.println( ctx.channel().remoteAddress() + "上线了");
    }

    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        //System.out.println(ctx.channel().remoteAddress() + "下线了");
    }

    @Override
    protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {

        Channel channel = ctx.channel();

        // 遍历channelGroup，根据情况发送消息， 需要排除自己
        channels.forEach(ch ->{
            if(ch  != channel){
                ch.writeAndFlush("【客户】" + channel.remoteAddress().toString().replace("/", "")  +" 发送消息： " + msg + "\n");
            }else {
                channel.writeAndFlush("【自己】发送了消息 " + msg + "\n");
            }
        });
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.close();
    }
}
